package com.wmcsk.dl.util;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.text.TextUtils;

import com.wmcsk.dl.bean.PluginBean;
import com.wmcsk.dl.dl.internal.DLIntent;
import com.wmcsk.dl.dl.internal.DLPluginManager;
import com.wmcsk.dl.dl.internal.DLPluginPackage;

/**
 * @author 刘红亮  2015年6月30日 下午5:03:58
 */
public class StartKnownPlugin {
	public static final String MainApkPackageName="sdkshell.kuaiyan.com.pluginsdk";
	//启动插件
	public static final int START_SUCCESS=0;
	public static final int START_FAIL=1;
	public static final int NO_INSTALL=-1;
	public static final int NO_CLASSNAME=-2;
	/**
	 * 启动指定的插件（加载是耗时操作）
	 * @param context  需要that
	 * @param pluginPackageName   已知有{@link StartKnownPlugin}中的常量，后续添加的可直接传入包名
	 * @param data   携带数据的Intent
	 * @return 启动成功：{@link #START_SUCCESS}，失败：{@link #START_FAIL}  未安装：{@link #NO_INSTALL}
	 */
	public static int startPlugin(Context context , String pluginPackageName, DLIntent data){
		PluginBean pluginBean = getPluginBean(context, pluginPackageName);
		//本地未找到，或者找到了，但还未下载
		if(pluginBean==null||pluginBean!=null&& TextUtils.isEmpty(pluginBean.pluginPath)){
			TS.show(context,"数据加载中，请稍后再试！");
			return NO_INSTALL;
		}
		boolean isLoaded= DLPluginManager.getInstance(context).isLoaded(pluginPackageName);
		try{
			if(!isLoaded){ //还没有加载过
				DLPluginPackage dlPluginPackage = DLPluginManager.getInstance(context).loadApk(pluginBean.pluginPath);
			}
			PackageInfo packageInfo= DLPluginManager.getInstance(context).getPackage(pluginPackageName).packageInfo;
			//如果data是空，没有参数
			if(data==null) data=new DLIntent();

			data.setPluginPackage(packageInfo.packageName);
			data.setPluginClass(packageInfo.activities[0].name);
			DLPluginManager.getInstance(context).startPluginActivity(context,data);
			return START_SUCCESS;
		}catch(Exception e){
			e.printStackTrace();
			return START_FAIL;
		}
	}
	/**
	 * 启动指定的插件（加载是耗时操作）
	 * @param context  需要that
	 * @param requestCode  请求码
	 * @param pluginPackageName   已知有{@link StartKnownPlugin}中的常量，后续添加的可直接传入包名
	 * @param data   携带数据的Intent
	 * @return 启动成功：{@link #START_SUCCESS}，失败：{@link #START_FAIL}  未安装：{@link #NO_INSTALL}
	 */
	public static int startPluginForResult(Context context , int requestCode, String pluginPackageName, DLIntent data){
		PluginBean pluginBean = getPluginBean(context, pluginPackageName);
		//本地未找到，或者找到了，但还未下载
		if(pluginBean==null||pluginBean!=null&& TextUtils.isEmpty(pluginBean.pluginPath)){
			TS.show(context,"数据加载中，请稍后再试！");
			return NO_INSTALL;
		}
		boolean isLoaded= DLPluginManager.getInstance(context).isLoaded(pluginPackageName);
		try{
			if(!isLoaded){ //还没有加载过
				DLPluginPackage dlPluginPackage = DLPluginManager.getInstance(context).loadApk(pluginBean.pluginPath);
			}
			PackageInfo packageInfo= DLPluginManager.getInstance(context).getPackage(pluginPackageName).packageInfo;
			//如果data是空，没有参数
			if(data==null) data=new DLIntent();

			data.setPluginPackage(packageInfo.packageName);
			data.setPluginClass(packageInfo.activities[0].name);
			DLPluginManager.getInstance(context).startPluginActivityForResult(context, data, requestCode);
			return START_SUCCESS;
		}catch(Exception e){
			e.printStackTrace();
			return START_FAIL;
		}
	}
	/**
	 * 启动指定的插件（加载是耗时操作）
	 * @param context  需要that
	 * @param pluginPackageName   已知有{@link StartKnownPlugin}中的常量，后续添加的可直接传入包名
	 * @param className  全类名
	 * @param data   携带数据的Intent
	 * @return 启动成功：{@link #START_SUCCESS}，失败：{@link #START_FAIL}  未安装：{@link #NO_INSTALL} 找不到类：{@link #NO_CLASSNAME}
	 */
	public static int startPlugin(Context context , String pluginPackageName, String className, DLIntent data){
		PluginBean pluginBean = getPluginBean(context, pluginPackageName);
		//本地未找到，或者找到了，但还未下载
		if(pluginBean==null||pluginBean!=null&& TextUtils.isEmpty(pluginBean.pluginPath)){
			TS.show(context,"数据加载中，请稍后再试！");
			return NO_INSTALL;
		}
		boolean isLoaded= DLPluginManager.getInstance(context).isLoaded(pluginPackageName);
		try{
			if(!isLoaded){ //还没有加载过
				DLPluginPackage dlPluginPackage = DLPluginManager.getInstance(context).loadApk(pluginBean.pluginPath);
			}
			PackageInfo packageInfo= DLPluginManager.getInstance(context).getPackage(pluginPackageName).packageInfo;
			//如果data是空，没有参数
			if(data==null) data=new DLIntent();

			data.setPluginPackage(packageInfo.packageName);
			for (ActivityInfo info:packageInfo.activities){
				if(info.name.equals(className)){
					data.setPluginClass(className);
					DLPluginManager.getInstance(context).startPluginActivity(context,data);
					return START_SUCCESS;
				}
			}
			return NO_CLASSNAME;
		}catch(Exception e){
			e.printStackTrace();
			return START_FAIL;
		}
	}
	/**
	 * 启动指定的插件（加载是耗时操作）
	 * @param context  需要that
	 * @param requestCode  请求码
	 * @param pluginPackageName   已知有{@link StartKnownPlugin}中的常量，后续添加的可直接传入包名
	 * @param className  全类名
	 * @param data   携带数据的Intent
	 * @return 启动成功：{@link #START_SUCCESS}，失败：{@link #START_FAIL}  未安装：{@link #NO_INSTALL} 找不到类：{@link #NO_CLASSNAME}
	 */
	public static int startPluginForResult(Context context , int requestCode, String pluginPackageName, String className, DLIntent data){
		PluginBean pluginBean = getPluginBean(context, pluginPackageName);
		//本地未找到，或者找到了，但还未下载
		if(pluginBean==null||pluginBean!=null&& TextUtils.isEmpty(pluginBean.pluginPath)){
			TS.show(context,"数据加载中，请稍后再试！");
			return NO_INSTALL;
		}
		boolean isLoaded= DLPluginManager.getInstance(context).isLoaded(pluginPackageName);
		try{
			if(!isLoaded){ //还没有加载过
				DLPluginPackage dlPluginPackage = DLPluginManager.getInstance(context).loadApk(pluginBean.pluginPath);
			}
			PackageInfo packageInfo= DLPluginManager.getInstance(context).getPackage(pluginPackageName).packageInfo;
			//如果data是空，没有参数
			if(data==null) data=new DLIntent();

			data.setPluginPackage(packageInfo.packageName);
			for (ActivityInfo info:packageInfo.activities){
				if(info.name.equals(className)){
					data.setPluginClass(className);
					DLPluginManager.getInstance(context).startPluginActivityForResult(context,data,requestCode);
					return START_SUCCESS;
				}
			}
			return NO_CLASSNAME;
		}catch(Exception e){
			e.printStackTrace();
			return START_FAIL;
		}
	}


	/**
	 * 根据包名去本地已下载列表中获得插件信息
	 * @param context
	 * @param pluginPackageName
	 * @return
	 */
	private static PluginBean getPluginBean(Context context, String pluginPackageName){
		if(TextUtils.isEmpty(pluginPackageName)){
			return null;
		}

		return null;
	}
}
